package core;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sql.ConexaoException;
import sql.CursoBD;
import sql.CursoException;
import sql.ProfessorBD;
import sql.ProfessorException;

/**
 * Servlet implementation class CursoServlet
 */
public class CursoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CursoServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		determinarAcoes( req, res );
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
	
	private void determinarAcoes(HttpServletRequest req, HttpServletResponse res) {
		Enumeration nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "cadastrar") ) {
			cadastrarCurso( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "pesquisar") ) {
			pesquisarCurso( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "remover") ) {
			removerCurso( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "editar") ) {
			editarCurso( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "atualizar") ) {
			atualizarCurso( req, res );
		}
	}

	private boolean temParametro(Enumeration lstNomes, String nome) {
		while( lstNomes.hasMoreElements() ) {
			String nomeDaLista = (String) lstNomes.nextElement();
			if( nomeDaLista.compareTo(nome) == 0 ) {
				return true;
			}
		}
		return false;
	}
	
	private boolean cadastrarCurso(HttpServletRequest req, HttpServletResponse res) {
		CursoBD bd = new CursoBD();

		String nome = req.getParameter( "nome" );
		String codigo = req.getParameter( "codigo" );
		try {
			bd.addCurso( nome, codigo );
			bd.close();
		} catch (CursoException e) {
			mensagemErro(req, res, "Erro Cadastro", e.getMessage() );
			return false;
		}
		mensagemSucesso( req, res, "Sucesso Cadastro.", "Curso <b>" + nome + "</b> cadastrado com sucesso.");

		return true;
	}
	
	private boolean pesquisarCurso(HttpServletRequest req, HttpServletResponse res) {
		CursoBD bd = new CursoBD();
		
		String nome = req.getParameter( "pesquisar" );
		try {
			
			ArrayList<Curso> lstCurso = bd.getCursos(nome);
			RequestDispatcher rd = req.getRequestDispatcher("pesquisa_curso.jsp");
			req.setAttribute("lista_resposta", lstCurso );
			rd.forward(req, res);
			bd.close();
			
		} catch (ConexaoException e) {
			mensagemErro(req, res, "Erro Pesquisa", e.getMessage() );
			return false;
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean removerCurso(HttpServletRequest req, HttpServletResponse res) {
		CursoBD bd = new CursoBD();
		
		String codigo = req.getParameter( "remover" );
		
		try {
			bd.delCurso( codigo );
			bd.close();
		} catch (CursoException e) {
			mensagemErro(req, res, "Erro Remover", e.getMessage() );
			return false;
		}
		
		mensagemSucesso(req, res, "Sucesso Remover", "Curso removido com sucesso.");
		return true;
	}
	
	private boolean editarCurso(HttpServletRequest req, HttpServletResponse res) {
		CursoBD bd = new CursoBD();
		
		String codigo = req.getParameter( "editar" );
		
		try {
			
			Curso tempCurso = bd.getCursoPorCodigo( codigo );
			RequestDispatcher rd = req.getRequestDispatcher( "editar_curso.jsp" );
			req.setAttribute( "curso", tempCurso );
			rd.forward( req, res );
			bd.close();
			
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean atualizarCurso( HttpServletRequest req, HttpServletResponse res ) {
		CursoBD bd = new CursoBD();
		
		String nome = req.getParameter( "nome" );
		String codigo = req.getParameter( "codigo" );
		String codigoAntigo = req.getParameter( "old" );
		
		Curso tempCurso = new Curso( nome, codigo );
		bd.updateCurso( tempCurso, codigoAntigo );
		bd.close();
		mensagemSucesso( req, res, "Sucesso Atualização.", "Curso <b>" + nome + "</b> editado com sucesso.");
		
		return true;
	}
	
	private void mensagemErro( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("erro.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void mensagemSucesso( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("sucesso.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}